package futbolfacil.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import futbolfacil.excepcion.DAOExcepcion;
import futbolfacil.modelo.Dueno;
import futbolfacil.util.ConexionBD;

public class DuenoDAO extends BaseDAO {
	
	public void insertar(Dueno objDueno) throws DAOExcepcion {
		System.out.println("DuenoDAO: insertar(Dueno vo)");
		
		validarDatos(objDueno);		
		validarDuplicado(objDueno);
		validarPassword(objDueno);
		validarCorreo(objDueno);
		
		String query = "INSERT INTO usuario(usr_usr, usr_pwd, usr_nom, usr_pat, usr_mat, " +
				"usr_dir, usr_dis, usr_fec_nac, usr_doc_tip, usr_doc_nro, usr_sex, usr_tlf, " +
				"usr_cor, usr_est, usr_fec_reg, usr_tip_cod) " +
				"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);		
			stmt.setString(1, objDueno.getUsuarioUsuario());
			stmt.setString(2, objDueno.getPasswordUsuario());
			stmt.setString(3, objDueno.getNombreUsuario());
			stmt.setString(4, objDueno.getPaternoUsuario());
			stmt.setString(5, objDueno.getMaternoUsuario());
			stmt.setString(6, objDueno.getDireccionUsuario());
			stmt.setString(7, objDueno.getDistritoUsuario());
			stmt.setString(8, objDueno.getFechaNacUsuario());
			stmt.setString(9, objDueno.getTipoDocUsuario());
			stmt.setString(10, objDueno.getNumeroDocUsuario());
			stmt.setString(11, objDueno.getSexoUsuario());
			stmt.setString(12, objDueno.getTelefonoUsuario());
			stmt.setString(13, objDueno.getCorreoUsuario());
			stmt.setString(14, objDueno.getEstadoUsuario());
			stmt.setString(15, objDueno.getFechaUsuario());
			stmt.setString(16, objDueno.getPrivilegioUsuario());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			System.out.println("Dueno Registrado. \n");
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void actualizar(Dueno objDueno) throws DAOExcepcion {		
		System.out.println("Dueno: actualizar(Dueno objDueno)");
		
		String query = 	"UPDATE usuario SET " +
						"usr_nom = ?, " +
						"usr_pat = ?, " +
						"usr_mat = ?, " +
						"usr_dir = ?, " +
						"usr_dis = ?, " +
						"usr_fec_nac = ?, " +
						"usr_doc_tip = ?, " +
						"usr_doc_nro = ?, " +
						"usr_sex = ?, " +
						"usr_tlf = ?, " +
						"usr_cor = ?, " +
						"usr_est = ?, " +
						"usr_tip_cod = ? " +
						"WHERE usr_usr = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objDueno.getNombreUsuario());
			stmt.setString(2, objDueno.getPaternoUsuario());
			stmt.setString(3, objDueno.getMaternoUsuario());
			stmt.setString(4, objDueno.getDireccionUsuario());
			stmt.setString(5, objDueno.getDistritoUsuario());
			stmt.setString(6, objDueno.getFechaNacUsuario());
			stmt.setString(7, objDueno.getTipoDocUsuario());
			stmt.setString(8, objDueno.getNumeroDocUsuario());
			stmt.setString(9, objDueno.getSexoUsuario());
			stmt.setString(10, objDueno.getTelefonoUsuario());
			stmt.setString(11, objDueno.getCorreoUsuario());
			stmt.setString(12, objDueno.getEstadoUsuario());
			stmt.setString(13, objDueno.getPrivilegioUsuario());
			stmt.setString(14, objDueno.getUsuarioUsuario());
			
			int i = stmt.executeUpdate();
			if (i != 1){
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void eliminar(int codigo) throws DAOExcepcion {
		System.out.println("Dueno: eliminar(String codigo)");
		
		String query = "DELETE FROM usuario WHERE usr_cod = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, codigo);
			int i = stmt.executeUpdate();
			if(i != 1){
				throw new DAOExcepcion("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Dueno> buscarPorNombre (String nombre) throws DAOExcepcion {		
		System.out.println("DuenoDao: buscarPorNombre(String nombre)");
		
		String query = "SELECT * FROM usuario WHERE usr_nom like ?";		
		Collection<Dueno> listDueno = new ArrayList<Dueno>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			
			while (rs.next()){
				Dueno objDueno = new Dueno();
				objDueno.setNombreUsuario(rs.getString("usr_nom"));
				objDueno.setPaternoUsuario(rs.getString("usr_pat"));
				objDueno.setMaternoUsuario(rs.getString("usr_mat"));
				listDueno.add(objDueno);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return listDueno;
	}
	
	public Dueno obtener(String nombre) throws DAOExcepcion {		
		System.out.println("Dueno: obtener(String nombre)");
		
		String query = "SELECT * FROM usuario WHERE usr_nom = ?";
		Dueno objDueno = new Dueno();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nombre);
			rs = stmt.executeQuery();
			
			if (rs.next()){
				objDueno.setNombreUsuario(rs.getString("usr_nom"));
				objDueno.setPaternoUsuario(rs.getString("usr_pat"));
				objDueno.setMaternoUsuario(rs.getString("usr_mat"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
				
		return objDueno;
	}
	
	public Collection<Dueno> listar() throws DAOExcepcion {
		System.out.println("DuenoDAO: listar()");
		
		Collection<Dueno> c = new ArrayList<Dueno>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT * FROM usuario WHERE usr_tip_cod = 2";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Dueno vo = new Dueno();
				vo.setCodigoUsuario(rs.getInt("usr_cod"));
				vo.setUsuarioUsuario(rs.getString("usr_usr"));
				vo.setNombreUsuario(rs.getString("usr_nom"));
				vo.setDireccionUsuario(rs.getString("usr_dir"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return c;
	}

	public Dueno buscar(String campo, String valor) throws DAOExcepcion {		
		System.out.println("DuenoDAO: buscar(String campo, String valor)");	
		
		String query = "SELECT * FROM usuario WHERE "+ campo +" = ?";		
		Dueno objDueno = new Dueno();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, valor);
			rs = stmt.executeQuery();
			
			if (rs.next()){
				objDueno.setNombreUsuario(rs.getString("usr_nom"));
				objDueno.setPaternoUsuario(rs.getString("usr_pat"));
				objDueno.setMaternoUsuario(rs.getString("usr_mat"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
				
		return objDueno;
	}
	
	/*
	  Igmar Leon
	*/
	
	public Dueno buscarPorCodigo(int codigo) throws DAOExcepcion {
		
		System.out.println("DuenoDAO: buscarPorCodigo(int codigo)");
		Dueno oDueno = new Dueno();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "Select * From usuario Where usr_cod = ?";
			con = ConexionBD.obtenerConexion();
			stmt=con.prepareStatement(query);
			stmt.setInt(1, codigo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oDueno.setCodigoUsuario(rs.getInt("usr_cod"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oDueno;
	}
	
	/* ----------------------------------------------------------------------
	 * Methodos extras.
	 */
	
	private void validarDatos(Dueno objDueno) throws DAOExcepcion {
		System.out.println("DuenoDAO: validarDatos(Dueno vo)");
		
		String msg = "";
		
		if(objDueno.getUsuarioUsuario().trim().equals(""))
			msg += "Usuario del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getPasswordUsuario().trim().equals(""))
			msg += "Password del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getPasswordUsuario2().trim().equals(""))
			msg += "Password de verifacion del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getNombreUsuario().trim().equals(""))
			msg += "Nombre del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getPaternoUsuario().trim().equals(""))
			msg += "Apellido paterno del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getMaternoUsuario().trim().equals(""))
			msg += "Apellido materno del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getDireccionUsuario().trim().equals(""))
			msg += "Direccion del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getDistritoUsuario().trim().equals(""))
			msg += "Distrito del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getFechaNacUsuario().trim().equals(""))
			msg += "Fecha de nacimiento del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getTipoDocUsuario().trim().equals(""))
			msg += "Tipo de documento del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getNumeroDocUsuario().trim().equals(""))
			msg += "Numero de documento del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getSexoUsuario().trim().equals(""))
			msg += "Sexo del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getTelefonoUsuario().trim().equals(""))
			msg += "Telefono del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getCorreoUsuario().trim().equals(""))
			msg += "Correo del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getCorreoUsuario2().trim().equals(""))
			msg += "Correo de verificacion del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getEstadoUsuario().trim().equals(""))
			msg += "Estado del Dueno no puede ser vacio.<br/> \n";
		if(objDueno.getPrivilegioUsuario().trim().equals(""))
			msg += "Privilegios del Dueno no puede ser vacio.<br/> \n";
		if(!msg.equals("")) {//Si exite algun error lanza excepcion
			System.out.println("Error:<br/> \n" + msg);
			throw new DAOExcepcion(msg);
		}	
	}
	
	private void validarDuplicado(Dueno objDueno) throws DAOExcepcion {
		System.out.println("DuenoDAO: validarDuplicado(Dueno objDueno)");
		
		String msg = "";
		
		if(existeDueno("usr_usr", objDueno.getUsuarioUsuario()))
			msg += "Usuario: " + objDueno.getUsuarioUsuario() + " ya existe. \n";
		if(existeDueno("usr_doc_nro", objDueno.getNumeroDocUsuario()))
			msg += "DNI: " + objDueno.getNumeroDocUsuario() + " ya existe. \n";
		if(existeDueno("usr_cor", objDueno.getCorreoUsuario()))
			msg += "Correo: " + objDueno.getCorreoUsuario() + " ya existe. \n";
		if(!msg.equals("")) {//Si exite algun error lanza excepcion
			System.out.println("Error: \n" + msg);
			throw new DAOExcepcion(msg);
		}
	}
	
	private boolean existeDueno(String campo, String valor) {
		System.out.println("DuenoDAO: existeDueno(String campo, String valor)");
		
		String query = "SELECT * FROM usuario WHERE "+ campo +" = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, valor);
			rs = stmt.executeQuery();
			
			if (rs.next()){
				return true;
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		
		return false;
	}

	private void validarPassword(Dueno objDueno) throws DAOExcepcion {
		String p1 = objDueno.getPasswordUsuario();
		String p2 = objDueno.getPasswordUsuario2();
		
		if(!p1.equals(p2)){
			System.out.println("Error: \n" + "Passwords no coinciden.");
			throw new DAOExcepcion("Passwords no coinciden.");
		}			
	}

	private void validarCorreo(Dueno objDueno) throws DAOExcepcion {
		String correo1 = objDueno.getCorreoUsuario();
		String correo2 = objDueno.getCorreoUsuario2();
		
		if(!correo1.equals(correo2)){
			System.out.println("Error: \n" + "Correos no coinciden.");
			throw new DAOExcepcion("Correos no coinciden.");
		}					
	}
	

	public Dueno login(String usr, String pwd) throws DAOExcepcion {
		
		System.out.println("DuenoDAO: login()");
		Dueno oDueno = new Dueno();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "Select * From usuario Where usr_tip_cod = 2 and usr_cod = ? and usr_pwd = ?";
			con = ConexionBD.obtenerConexion();
			stmt=con.prepareStatement(query);
			stmt.setString(1, usr);
			stmt.setString(2, pwd);
			rs = stmt.executeQuery();
			if (rs.next()) {
				oDueno.setCodigoUsuario(rs.getInt("usr_cod"));
				oDueno.setCodigoUsuario(rs.getInt("usr_usr"));
				oDueno.setCodigoUsuario(rs.getInt("usr_pwd"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oDueno;
	}
}
